#include "page.h"

void set_page_dir_entry(page_dir_t *dir, int n, page_tab_t *tab) {
    uint32_t val = (uint32_t) tab;
    val |= 7; // 1 页存在 2 可读写 4 用户态可用
    dir->entries[n] = val;
}

void set_page_tab_entry(page_tab_t *tab, int n, uint32_t addr) {
    addr |= 7; // 1 页存在 2 可读写 4 用户态可用
    tab->entries[n] = addr;
}

void init_page_dir(page_dir_t *dir) {
    int i;
    for(i = 0; i < PAGE_DIR_ENTRIES; i++) {
        dir->entries[i] = 0;
    }
}

void init_page_tab(page_tab_t *tab, uint32_t addr) {
    int i;
    addr |= 7;
    for(i = 0; i < PAGE_DIR_ENTRIES; i++) {
        tab->entries[i] = addr + (i * 4096);
    }
}

void enable_page(page_dir_t *dir) {
    asm volatile(
        "mov %0, %%cr3\n\t"
        "mov %%cr0, %%eax\n\t"
        "or $(1 << 31), %%eax\n\t"
        "mov %%eax, %%cr0\n\t"
        "ljmp $0x08, $1f\n\t"
        "1:\n\t"
        :
        :"r"(dir)
    );
}
